package org.poker.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Possible {


    /**
     * recebe a qtd de bits, e retorna em um List de array de char,
     * todas as possibilidades ex:
     *
     * 5 bits
     *
     * 0 : 00000
     * 1 : 00001
     * 2 : 00010
     * 3 : 00011
     * 4 : 00100
     * 5 : 00101
     * 6 : 00110
     * 7 : 00111
     * 8 : 01000
     * 9 : 01001
     * 10 : 01010
     * 11 : 01011
     * 12 : 01100
     * 13 : 01101
     * 14 : 01110
     * 15 : 01111
     * 16 : 10000
     * 17 : 10001
     * 18 : 10010
     * 19 : 10011
     * 20 : 10100
     * 21 : 10101
     * 22 : 10110
     * 23 : 10111
     * 24 : 11000
     * 25 : 11001
     * 26 : 11010
     * 27 : 11011
     * 28 : 11100
     * 29 : 11101
     * 30 : 11110
     * 31 : 11111
     *
     * @param qtdBits
     */
    public static List<char[]> allPossibles(int qtdBits) {
	String maxBitsOn = "";
	for(int i = 0; i < qtdBits; i++)
	    maxBitsOn = maxBitsOn.concat("1");
	Integer decimal = Integer.valueOf(Integer.parseInt(maxBitsOn, 2) + 1);
	List<char[]> listResult = new ArrayList<char[]>(decimal.intValue());
	for(int i = 0; i < decimal.intValue(); i++) {
	    String bits = Integer.toBinaryString(i);
	    String result = append("0", qtdBits - bits.length());
	    result = result.concat(bits);
	    char[] bitsArray = result.toCharArray();
	    listResult.add(bitsArray);
	}
	return listResult;
    }

    public static List<boolean[]> allPossiblesBoolean(int qtdBits) {
	List<char[]> listBits = allPossibles(qtdBits);
	List<boolean[]> result = new ArrayList<boolean[]>(listBits.size());
	for (char[] cs : listBits) {
	    int i = 0;
	    boolean[] booleans = new boolean[cs.length];
	    for (char c : cs) {
		booleans[i] = c=='1'?true:false;
		i++;
	    }
	    result.add(booleans);
	}
	return result;
    }

    private static String append(String append, int size) {
	String result = "";
	for(int i = 0; i<size; i++)
	    result = result.concat(append);
	return result;
    }


}
